package com.looklook.xinghongfei.looklook.adapter; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.graphics.ColorMatrixColorFilter; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.resource.drawable.GlideDrawable; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import com.looklook.xinghongfei.looklook.MainActivity; import com.looklook.xinghongfei.looklook.R; import com.looklook.xinghongfei.looklook.activity.ZhihuDescribeActivity; import com.looklook.xinghongfei.looklook.bean.zhihu.ZhihuDailyItem; import com.looklook.xinghongfei.looklook.config.Config; import com.looklook.xinghongfei.looklook.util.DBUtils; import com.looklook.xinghongfei.looklook.util.DensityUtil; import com.looklook.xinghongfei.looklook.util.DribbbleTarget; import com.looklook.xinghongfei.looklook.util.ObservableColorMatrix; import com.looklook.xinghongfei.looklook.widget.BadgedFourThreeImageView; import java.util.ArrayList; public class ZhihuAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements MainActivity.LoadingMore { private static final int TYPE_LOADING_MORE = -1; private static final int TYPE_NORMAL = 1; private boolean loadingMore; private int mImageWidth; private int mImageHeigh; private ArrayList<ZhihuDailyItem> zhihuDailyItems = new ArrayList<>(); private Context mContext; public ZhihuAdapter(Context context) { this.mContext = context; float width = mContext.getResources().getDimension(R.dimen.image_width); mImageWidth = DensityUtil.dip2px(mContext, width); mImageHeigh = mImageWidth * 3 / 4; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case TYPE_NORMAL: return new ZhihuViewHolder(LayoutInflater.from(mContext).inflate(R.layout.zhihu_layout_item, parent, false)); case TYPE_LOADING_MORE: return new LoadingMoreHolder(LayoutInflater.from(mContext).inflate(R.layout.infinite_loading, parent, false)); } return null; } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { int type = getItemViewType(position); switch (type) { case TYPE_NORMAL: bindViewHolderNormal((ZhihuViewHolder) holder, position); break; case TYPE_LOADING_MORE: bindLoadingViewHold((LoadingMoreHolder) holder, position); break; } } private void bindLoadingViewHold(LoadingMoreHolder holder, int position) { holder.progressBar.setVisibility(loadingMore == true ? View.VISIBLE : View.INVISIBLE); } private void bindViewHolderNormal(final ZhihuViewHolder holder, final int position) { final ZhihuDailyItem zhihuDailyItem = zhihuDailyItems.get(holder.getAdapterPosition()); if (DBUtils.getDB(mContext).isRead(Config.ZHIHU, zhihuDailyItem.getId(), 1)) holder.textView.setTextColor(Color.GRAY); else holder.textView.setTextColor(Color.BLACK); holder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startDescribeActivity(holder, zhihuDailyItem); } }); holder.textView.setText(zhihuDailyItem.getTitle()); holder.linearLayout.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { startDescribeActivity(holder, zhihuDailyItem); } }); Glide.with(mContext) .load(zhihuDailyItems.get(position).getImages()[0]) .listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { if (!zhihuDailyItem.hasFadedIn) { holder.imageView.setHasTransientState(true); final ObservableColorMatrix cm = new ObservableColorMatrix(); final ObjectAnimator animator = ObjectAnimator.ofFloat(cm, ObservableColorMatrix.SATURATION, 0f, 1f); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { holder.imageView.setColorFilter(new ColorMatrixColorFilter(cm)); } }); animator.setDuration(2000L); animator.setInterpolator(new AccelerateInterpolator()); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); holder.imageView.clearColorFilter(); holder.imageView.setHasTransientState(false); animator.start(); zhihuDailyItem.hasFadedIn = true; } }); } return false; } }).diskCacheStrategy(DiskCacheStrategy.SOURCE) .centerCrop().override(mImageWidth, mImageHeigh) .into(new DribbbleTarget(holder.imageView, false)); } private void startDescribeActivity(ZhihuViewHolder holder, ZhihuDailyItem zhihuDailyItem) { DBUtils.getDB(mContext).insertHasRead(Config.ZHIHU, zhihuDailyItem.getId(), 1); holder.textView.setTextColor(Color.GRAY); Intent intent = new Intent(mContext, ZhihuDescribeActivity.class); intent.putExtra("id", zhihuDailyItem.getId()); intent.putExtra("title", zhihuDailyItem.getTitle()); // final android.support.v4.util.Pair<View, String>[] pairs = Help.createSafeTransitionParticipants // ((Activity) mContext, false,new android.support.v4.util.Pair<>(holder.imageView, mContext.getString(R.string.transition_shot)), // new android.support.v4.util.Pair<>(holder.linearLayout, mContext.getString(R.string.transition_shot_background))); // ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation((Activity) mContext, pairs); // mContext.startActivity(intent, options.toBundle()); mContext.startActivity(intent); } @Override public int getItemCount() { return zhihuDailyItems.size(); } public void addItems(ArrayList<ZhihuDailyItem> list) { zhihuDailyItems.addAll(list); notifyDataSetChanged(); } @Override public int getItemViewType(int position) { if (position < getDataItemCount() && getDataItemCount() > 0) { return TYPE_NORMAL; } return TYPE_LOADING_MORE; } private int getDataItemCount() { return zhihuDailyItems.size(); } private int getLoadingMoreItemPosition() { return loadingMore ? getItemCount() - 1 : RecyclerView.NO_POSITION; } // TODO: 16/8/13 don't forget call fellow method @Override public void loadingStart() { if (loadingMore) return; loadingMore = true; notifyItemInserted(getLoadingMoreItemPosition()); } @Override public void loadingfinish() { if (!loadingMore) return; final int loadingPos = getLoadingMoreItemPosition(); loadingMore = false; notifyItemRemoved(loadingPos); } public void clearData() { zhihuDailyItems.clear(); notifyDataSetChanged(); } private static class LoadingMoreHolder extends RecyclerView.ViewHolder { ProgressBar progressBar; public LoadingMoreHolder(View itemView) { super(itemView); progressBar = (ProgressBar) itemView; } } private static class ZhihuViewHolder extends RecyclerView.ViewHolder { TextView textView; LinearLayout linearLayout; BadgedFourThreeImageView imageView; ZhihuViewHolder(View itemView) { super(itemView); imageView = (BadgedFourThreeImageView) itemView.findViewById(R.id.item_image_id); textView = (TextView) itemView.findViewById(R.id.item_text_id); linearLayout = (LinearLayout) itemView.findViewById(R.id.zhihu_item_layout); } } }